
	// 创建一个套接字socket
	int fd;
	fd = socket(AF_INET,SOCK_STREAM,0);
	if(fd < 0){
		perror("socket");
		exit(1);
	}
	puts("--创建套接字成功--");

	//允许地址重用
	int optval = 1;
	socklen_t optval_len = sizeof(optval);
	setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&optval,optval_len);

	// 填充自己的服务器IP地址信息结构体
	struct sockaddr_in sin;
	bzero(&sin,sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_port = htons(atoi(argv[2]));
	sin.sin_addr.s_addr = inet_addr(argv[1]);//INADDR_ANY  所有的网卡都能提供服务
	puts("--填充服务器结构体成功--");

	// bind 绑定fd
	int ret_bind = bind(fd,(struct sockaddr*)&sin,sizeof(sin));
	if(ret_bind < 0){
		perror("bind");
		close(fd);
		exit(2);
	}
	puts("--地址信息绑定成功，服务器开始工作--");


	// listen 监听
	int ret_lis = listen(fd,128); //BACKLOG 128
	if(ret_lis < 0){
		perror("listen");
		exit(1);
	}
//与QT通信的线程
void *pthread_qt_connect(void *arg)
{
	int fd = *(int *)arg;

	//定义一个文件描述符的集合
	fd_set staff_fds,temp_fds;
	FD_ZERO(&staff_fds);
	FD_ZERO(&temp_fds);
	FD_SET(fd,&staff_fds);

	//定义一个存储的客户端的地址信息结构体
	struct sockaddr_in cin;
	bzero(&cin,sizeof(cin));
	socklen_t addrlen = sizeof(cin);
	char buf[BUFSIZ] = {};
	char *errmsg;
	int val = -1;
	int newfd = -1;
	int i;
	ssize_t ret_rcv = -1;
	int maxfd = fd;
	while(1){
		temp_fds = staff_fds;
		val = select(maxfd+1,&temp_fds,NULL,NULL,0);
		if(val < 0){
			perror("select");
			continue;
		}
		else if(val > 0){
			for(i = 3;i<maxfd+1;i++){
				if(FD_ISSET(i,&temp_fds)){
					if(i==fd){
						newfd = accept(fd,(struct sockaddr*)&cin,&addrlen);
						if(newfd < 0){
							perror("accept");
							exit(1);
						}
						printf("--%s-%d-已连接--\n",(char *)inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
						FD_SET(newfd,&staff_fds);
						//插入节点
						insert_head_node(base,newfd);
						maxfd = maxfd > newfd?maxfd:newfd;
					}
					else if(i>fd){
						LinkNode *temp_node;
						search_node(base, i, &temp_node);
						if (temp_node == NULL)
						{
							printf("search error\n");
							return -1;
						}
						switch (temp_node->status)
						{
						case 0: //开始接受数据包
							ret = recv(i, temp_node->rbuf + temp_node->buf_pos, sizeof(MSG_HEADER) - temp_node->buf_pos, 0);
							printf("recv header %x, len:%d\n", i, ret);
							if (ret == -1)
							{
								perror("recv error");
								return -1;
							}
							else if (ret == 0)
							{
								FD_CLR(i, &staff_fds);
								delete_node(base, i);
								close(i);
							}
							else
							{
								temp_node->buf_pos += ret;
								//进行判断magic
								printf("%08x\n",*(int*)temp_node->rbuf);
								if(0xaaaaaaaa ==*(int*)temp_node->rbuf)
								{
									if(temp_node->buf_pos >=sizeof(MSG_HEADER))
									{
										temp_node->status=1;
										MSG_HEADER *header;
										header=(MSG_HEADER*)temp_node->rbuf;
										temp_node->lenth=header->lenth;
									}
									else
									{
										continue;
									}
								}
								else
								{
									/*表示接收到的不是magic*/
									temp_node->buf_pos=0;
								}
							}
							break;
						case 1: //开始接受数据包主体
							ret=recv(i,temp_node->rbuf+temp_node->buf_pos,temp_node->lenth,0);
							printf("recv data %d,len:%d\n",i,ret);
							if(ret == -1)
							{
								perror("recv error");
								return -1;
							}
							else if(ret == 0)
							{
								FD_CLR(i,&readfd);
								delete_node(base,i);
								close(i);
							}
							else
							{
								temp_node->lenth -= ret;
								if(temp_node->lenth > 0)
								{
									continue;
								}
								else
								{
									//接收到完整的数据包主体
									printf("接受完成\n");
									//把数据送到数据解析模块进行处理
									data_handle(db,staff_db,&errmsg,temp_node->rbuf,i);
									printf("handle completeed\n");
									temp_node->status = 0;
									temp_node->buf_pos=0;
									temp_node->lenth =0;
									memset(temp_node->rbuf,0,sizeof(temp_node->rbuf));
								}
							}
							break;

						default:
							break;
						}
					}
				}
			}
		}
	}
}
